package com.gp.controller.system;

import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.gp.common.result.JsonResult;
import com.gp.controller.BaseController;
import com.gp.model.entity.BasePermission;
import com.gp.model.entity.BaseSystemSettings;
import com.gp.model.entity.SystemLog;
import com.gp.service.IBasePermissionService;
import com.gp.service.IBaseSystemSettingsService;


/**
*@date: 2018年1月11日
*@author: 弓成龙
*@email: gcx909109@sina.cn
*@description: 系统控制controller，系统的默认配置将会存储在数据库当中，修改系统的配置将会被记录在系统的log日志当中。
**/
@RestController
@RequestMapping(value="/system")
public class SystemController extends BaseController{
  
  @Autowired
  private IBaseSystemSettingsService systemService;
  @Autowired
  private IBasePermissionService permissionService;
  
  /**
   *  搜索所有的系统配置
   *  
   * @param page 分页条件显示
   * @return
   */
  @RequestMapping("/list")
  public JsonResult listAllConfig(Page<BaseSystemSettings> page,@RequestParam(value="isSearch",required=false) Integer isSearch){
    if(isSearch!=null && isSearch==1) {
      Wrapper<BaseSystemSettings> wapper = new EntityWrapper<>();
      Map<String, Object> condition = page.getCondition();
      wapper.like("configName", (String)condition.get("configName"));
      page.setCondition(null);
      Page<BaseSystemSettings> page2 = systemService.selectPage(page,wapper);
      page2.setCondition(condition);
      return new JsonResult("检索成功",page2); 
    }else {
       Page<BaseSystemSettings> result = systemService.selectPage(page);
    }
    return new JsonResult("检索成功",page);
  }
  
  /**
   * 增加系统配置
   * @param config 传入一个配置对象 dto
   * @return 增加的结果
   */
  @RequestMapping("/addConfig")
  public JsonResult addConfig(BaseSystemSettings config){
    Boolean flag= systemService.insert(config);
    return flag ? renderSuccess("增加成功") : renderError("增加失败");
  }
  
  /**
   * 删除一个系统配置
   * @param 配置的id
   * @return 删除的结果
   */
  @RequestMapping("/delConfig/{configId}")
  public JsonResult delConfig(@PathVariable(value="configId") String configId){
    Boolean flag= systemService.deleteById(Long.parseLong(configId));
    return flag ? renderSuccess("删除成功") : renderError("删除失败");
  }
  
  /**
   * 编辑系统配置
   * @param config 传入一个配置对象 dto
   * @return 编辑的结果
   */
  @RequestMapping("/editConfig")
  public JsonResult editConfig(BaseSystemSettings config){
    Boolean flag= systemService.updateById(config);
    return flag ? renderSuccess("编辑成功") : renderError("编辑失败");
  }
  
  /**
   * 按照条件列表用户操作记录
   * @param page 分页条件
   * @return JsonResult
   */
  public JsonResult listUserOperationRecords(Page<?> page){
    Page<?> result = systemService.listUserOperationRecords(page);
    return new JsonResult("检索成功",result);
  }
  
  /**
   * 搜索一个系统配置的详细信息
   * @param page 搜索的条件
   * @return JsonResult
   */
  private JsonResult selectOperationRecord(Page<?> page){
    SystemLog result = systemService.selectOperationRecord(page);
    return new JsonResult("检索成功",result);
  }
  
  
  /****************************************
   *  系统的权限配置
   *  
   */
  
  /**
   * 检索权限信息(可以根据用户的角色来选择权限，也可以根据权限的名称来检索权限或者是通过其父权限来检索所有对应的子权限，抑或是通过子权限来检索所有的父权限)
   * @param page
   * @return
   */
  @RequestMapping("/permission/list")
  public JsonResult listPermissions(Page<BasePermission> page) {
    Page<BasePermission> permissions = permissionService.selectPage(page);
    return new JsonResult("检索成功",permissions);
  }
  
  /**
   *  编辑一条权限（添加或者是删除）， 可以编辑的项为： 名称，url,状态和parentPermission
   * @param permission 编辑完成的permission
   * @return 
   */
  @RequestMapping("/permission/edit")
  public JsonResult editPermission(@Valid BasePermission permission) {
    boolean result = permissionService.updateById(permission);
    return new JsonResult("编辑成功",result);   
  }
  
  /**
   * 根据传入的id进行删除，其实进行修改状态是失效，并不对数据库进行真正的删除操作
   * @param id
   * @return
   */
  @RequestMapping("/permission/del/{id}")
  public JsonResult delPermission (@Valid @PathVariable int id) {
    boolean result = permissionService.deleteById(id);
    return new JsonResult("删除成功",result);   
  }
}
